/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package edu.uoc.tfc.exuoc.model;

import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;

import edu.uoc.tfc.exuoc.config.Config;

import java.util.Date;
import javax.persistence.Column;
import javax.persistence.JoinColumn;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Inheritance;
import javax.persistence.Temporal;
import javax.persistence.Transient;
import javax.persistence.ManyToOne;


import edu.uoc.tfc.exuoc.controladors.GestorLogs ;

/**
 *
 * @author emoreno
 */

@Entity
@Table(name="usuaris")
//Declaració de la columna que lliga l'herència
@PrimaryKeyJoinColumn(name="id")
@Inheritance(strategy = javax.persistence.InheritanceType.JOINED)
public class Usuari extends Persona implements Serializable , Comparable{
    private static final long serialVersionUID = 4356342346L;
   // private Long id;
    private String login=Config.valorNullStr;           //character(8).
    private String contrasenya=Config.valorNullStr ;    //character varying(32) NOT NULL,
    private Boolean actiu=true ;                        //boolean NOT NULL DEFAULT true,
    private String email=Config.valorNullStr;           //character varying(60),
    private Date dataalta=new Date();             //date NOT NULL DEFAULT ('now'::text)::date,
    private Date databaixa=new Date();            // date,

    //A quin grup pertany aquest usuari
    private Grup grup;           // REFERENCES grups (id) MATCH SIMPLE
    
    //El control de versions es fa mitjançant la classe pare
    //private int versionNum;

   
    public Usuari() { }

    public Usuari(Long id, String nom, String cognoms, String adress, String telf, Date naixament, int versionNum, String login, String contrasenya, Boolean actiu, Date dataalta, Date databaixa, Grup grup) {
        super(id, nom, cognoms, adress, telf, naixament, versionNum);
        //this.id = id;
        this.login = login;
        this.contrasenya = contrasenya;
        this.actiu = actiu;
        this.dataalta = dataalta;
        this.databaixa = databaixa;
        this.grup = grup;
    }

    public Usuari(String nom, String cognoms, String adress, String telf, Date naixament, String login, String contrasenya, Boolean actiu, Date dataalta, Grup grup) {
        super(nom, cognoms, adress, telf, naixament);
        this.login = login;
        this.contrasenya = contrasenya;
        this.actiu = actiu;
        this.dataalta = dataalta;
        this.grup = grup;
    }

    @Column(nullable=false)
    public Boolean getActiu() {
        if (this.actiu==null) return true;
        else return actiu;
    }

    public void setActiu(Boolean actiu) {
        this.actiu = actiu;
    }

    @Column(length=32,nullable=false)
    public String getContrasenya() {
        return contrasenya;
    }

    public void setContrasenya(String contrasenya) {
        this.contrasenya = contrasenya;
    }

    @Column(nullable=false)
    @Temporal(javax.persistence.TemporalType.DATE)
    public Date getDataalta() {
        return dataalta;
    }

    public void setDataalta(Date _dataalta) {
        this.dataalta = _dataalta;
    }

    @Temporal(javax.persistence.TemporalType.DATE)
    public Date getDatabaixa() {
        return databaixa;
    }

    public void setDatabaixa(Date _databaixa) {
        this.databaixa = _databaixa;
    }

    @Column(length=8,nullable=false,unique=true)
    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    @ManyToOne
    @JoinColumn(name="grup_id")
    public Grup getGrup(){
        return this.grup;
    }
 
    public void setGrup(Grup _grup){
        this.grup=_grup;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    @SuppressWarnings("EqualsWhichDoesntCheckParameterClass")
    public boolean equals(Object obj) {
        Usuari other;
        try {
            if (obj == null) {
                GestorLogs .getLogger(this.getClass().getSimpleName())
                        .info("Objecte null a comparar");
                return false;
            }else {
                other = (Usuari)obj;
            }
            if (!this.getId().equals(other.getId())) {
                //GestorLogs .getLogger(this.getClass().getSimpleName()).info("ids diferents");
                //GestorLogs .getLogger(this.getClass().getSimpleName()).info("Crida:"+this.getClass().getClassLoader().getClass().getSimpleName());
                return false;
            }

            if (!this.login.trim().equals(other.getLogin().trim())) {
                //GestorLogs .getLogger(this.getClass().getSimpleName()).info("Logins diferents");
                return false;
            }

        }catch(ClassCastException e){
            //GestorLogs .getLogger(this.getClass().getSimpleName()).info("Classes diferents");
            return false;
        }catch(NullPointerException e){
            GestorLogs .getLogger(this.getClass().getSimpleName())
                    .info("S'estan comparant valors nulls");
            //GestorLogs .getLogger(this.getClass().getSimpleName()).info("Crida:"+this.getClass().getClassLoader().getClass().getSimpleName());
            return false;
        }
        return true;
    }

    @Override
     public int compareTo(Object o) {
        Usuari i =null;
        if (o == null) {
            return -1;
        }
/*        if (!this.getClass().equals(o.getClass())) {
           return -21;
        }
        i=(Usuari)o;*/

        return (this.equals(o))? 0:1;
    }

    @Override
    public String toString(){
        String cad="";
        //Emili:08-12-2011:Es canvia != -> .equals():if (this.getId() != null ){
        
        if ( this.getId() != null ){
            cad=this.getId()+": ";
        }
        cad+=this.getCognoms()+", "+this.getNom()+"; "+this.getLogin()+"; "
                +this.getDataalta()+"; "+this.getActiu().toString();
        return cad;
    }


    @Override
    public int hashCode() {
        int hash = 5;
        hash = 67 * hash + (this.getId() != null ? this.getId().hashCode() : 0);
        hash = 67 * hash + (this.login != null ? this.login.hashCode() : 0);
        hash = 67 * hash + (this.contrasenya != null ? this.contrasenya.hashCode() : 0);
        hash = 67 * hash + (this.dataalta != null ? this.dataalta.hashCode() : 0);
        return hash;
    }


    @Transient
    public Boolean isAdmin(){
        
        return (this.getGrup().getId().intValue()==Config.ADIMINISTRADOR);

    }
    @Transient
    public Boolean isGestor(){
        //08-12-2011:Emili:return Integer.valueOf(this.getGrup().getId()).equals(Config.GESTOR);
        return (this.getGrup().getId().intValue()==Config.GESTOR);
    }
    @Transient
    public Boolean isAutenticat(){
        //08-12-2011:Emili:return Integer.valueOf(this.getGrup().getId()).equals(Config.AUTENTICAT);
        return (this.getGrup().getId().intValue()==Config.AUTENTICAT);
    }



    
}
